package com.tuling.code.thread.exam02;

/**
 * 线程交替执行 线程A循环5次，线程B循环10次，接着又回到线程A循环5次，接着再回到线程B又循环10，如此循环50次。
 * 
 * @author javaw
 *
 */
public class MainTest {
	public static void main(String[] args) {
		final Business business = new Business();
		new Thread(new Runnable() {
			@Override
			public void run() {
				for (int i = 1; i <= 10; i++) {
					business.SubThread(i);
				}
			}
		}).start();
		
		// 两个循环只能有一个来用线程启动，否则。如果都用new Thread的方式，
		// 一旦一个线程开启，第二个线程必须等待其完成才能开启，发生了死锁现象。
		for (int i = 1; i <= 10; i++) {
			business.MainThread(i);
		}

	}
}

class Business {
	//private static Object lock = new Object();
	// 作为子线程和主线程谁来执行的标志，true为子线程执行，主线程等待
	volatile boolean flag = false;

	public synchronized void MainThread(int i) {
		if (flag) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		for (int j = 1; j <= 5; j++) {
			System.out.println("主线程" + i + "执行" + j);
		}
		this.notifyAll();
		flag = true;
	}

	public synchronized void SubThread(int i) {
		if (!flag) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		for (int j = 1; j <=10; j++) {
			System.err.println("子线程" + i + "执行" + j);
		}
		this.notifyAll();
		flag = false;
	}

}